// ============================== 导入依赖 ============================== //

import MAP from '../MAP'
import CORE from '../UTIL'
import util from './util'

// ============================== 状态集 ============================== //

const state = {
  // —————————————————————————————— 数据 —————————————————————————————— //

  /**
   * 接口
   */
  API: {
    ...util.API,
    transSubmit(one, context) {
      return one
    },
    async submit(one, TIP = MAP.TIP_SUBMIT) {
      throw util.errorAPI(TIP, 'submit')
    },
    dealSubmit(resp, context) {
      //
    },

    transAdd(one, context) {
      return one
    },
    async add(one, TIP = MAP.TIP_ADD) {
      throw util.errorAPI(TIP, 'add')
    },

    transEditToAdd: false,
    transEdit(one, context) {
      return one
    },
    async edit(one, TIP = MAP.TIP_EDIT) {
      throw util.errorAPI(TIP, 'edit')
    },

    transDel(one, context) {
      return one
    },
    async del(one, TIP = MAP.TIP_DEL) {
      throw util.errorAPI(TIP, 'del')
    },

    transPass(one, context) {
      return one
    },
    async pass(one, TIP = MAP.TIP_PASS) {
      throw util.errorAPI(TIP, 'pass')
    },

    transRej(one, context) {
      return one
    },
    async rej(one, TIP = MAP.TIP_REJ) {
      throw util.errorAPI(TIP, 'rej')
    },
  },

  /**
   * 映射
   */
  MAP: {
    WORD: '', // 词语 (初始常量，不可更新)

    SUBMIT: null, // 提交 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    SHOW: null, // 查看 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    ADD: null, // 新增 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    EDIT: null, // 修改 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    DEL: null, // 删除 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    PASS: null, // 通过 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    REJ: null, // 拒绝 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    PASSED: null, // 已通过 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    REJED: null, // 已拒绝 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')

    PREFIX: null, // 前缀 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    MIDDLE: null, // 中间 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    SUFFIX: null, // 后缀 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')

    tipSubmit: '', // 提交提示 (有值时直接使用，无值时拼接生成)
    tipShow: '', // 查看提示 (有值时直接使用，无值时拼接生成)
    tipAdd: '', // 新增提示 (有值时直接使用，无值时拼接生成)
    tipEdit: '', // 修改提示 (有值时直接使用，无值时拼接生成)
    tipDel: '', // 删除提示 (有值时直接使用，无值时拼接生成)
    tipPass: '', // 通过提示 (有值时直接使用，无值时拼接生成)
    tipRej: '', // 拒绝提示 (有值时直接使用，无值时拼接生成)

    tipDelContent: '', // 删除提示的内容 (有值时直接使用，无值时拼接生成)
    tipPassContent: '', // 通过提示的内容 (有值时直接使用，无值时拼接生成)
    tipRejContent: '', // 拒绝提示的内容 (有值时直接使用，无值时拼接生成)
  },

  /**
   * 字典
   */
  DICT: {
    //
  },

  /**
   * 初始配置
   */
  INIT_CONFIG: {
    /**
     * 删除后后是否保持 ID 不变
     *
     * true  保持 ID 不变
     * false 设置 ID = ''
     */
    DEL_KEEP_ID: false,

    /**
     * 提交后是否保持弹窗可见
     *
     * true  保持弹窗可见
     * false 提交后关闭弹窗
     */
    SUBMIT_KEEP_VISIBLE: false,

    /**
     * 提交后是否保持信息弹窗可见
     *
     * true  保持信息弹窗可见
     * false 提交后关闭弹窗
     */
    SUBMIT_KEEP_INFO_VISIBLE: false,

    /**
     * 提交后刷新的延迟毫秒数
     */
    SUBMIT_REFRESH_DELAY: 0,
  },

  /**
   * 初始单项
   *
   * 1. 初始存在，才能响应
   * 2. CORE.mixStore(store) 时使用
   * 3. setOne() 重置时使用
   * 4. openAdd() 新增时使用
   */
  INIT_ONE: {
    id: '',
  },

  /**
   * 单项
   */
  one: {
    id: '',
  },

  /**
   * 表单 await this.refForm.check()
   */
  refForm: null,

  // —————————————————————————————— 提交 —————————————————————————————— //

  /**
   * 远程提交开关
   */
  needSubmit: false,

  /**
   * 提交就绪开关
   */
  readySubmit: false,

  // —————————————————————————————— 增 —————————————————————————————— //

  /**
   * 远程新增开关
   */
  needAdd: false,

  /**
   * 新增就绪开关
   */
  readyAdd: false,

  // —————————————————————————————— 改 —————————————————————————————— //

  /**
   * 远程修改开关
   */
  needEdit: false,

  /**
   * 修改就绪开关
   */
  readyEdit: false,

  // —————————————————————————————— 删 —————————————————————————————— //

  /**
   * 远程删除开关
   */
  needDel: false,

  /**
   * 删除就绪开关
   */
  readyDel: false,

  // —————————————————————————————— 通过 —————————————————————————————— //

  /**
   * 远程通过开关
   */
  needPass: false,

  /**
   * 通过就绪开关
   */
  readyPass: false,

  // —————————————————————————————— 拒绝 —————————————————————————————— //

  /**
   * 远程拒绝开关
   */
  needRej: false,

  /**
   * 拒绝就绪开关
   */
  readyRej: false,
}

// ============================== 计算属性 ============================== //

const getters = {}

// ============================== 同步更新 ============================== //

const mutations = {
  // —————————————————————————————— 设置 —————————————————————————————— //

  /**
   * 设置单项
   */
  setOne(state, one) {
    util.setClone(state, one, 'one')
  },

  /**
   * 设置表单
   */
  setRefForm(state, refForm) {
    state.refForm = refForm || null
  },

  // —————————————————————————————— 提交 —————————————————————————————— //

  /**
   * 开始远程提交
   */
  startSubmit(state) {
    util.startDelay('Submit', state)
  },

  /**
   * 完成远程提交
   */
  completeSubmit(state, msgSuccess) {
    util.completeRefresh('Submit', state, msgSuccess, this)
  },

  /**
   * 终止远程提交
   */
  stopSubmit(state, e) {
    util.stop('Submit', state, e)
  },

  // —————————————————————————————— 增 —————————————————————————————— //

  /**
   * 开始远程新增
   */
  startAdd(state) {
    util.startDelay('Add', state)
  },

  /**
   * 完成远程新增
   */
  completeAdd(state, msgSuccess) {
    if (state.MAIN_START === 'startList' && !state.INIT_CONFIG.IS_LONG_LIST) state.param.page = 1 // 回到首页
    util.completeRefresh('Add', state, msgSuccess, this)
  },

  /**
   * 终止远程新增
   */
  stopAdd(state, e) {
    util.stop('Add', state, e)
  },

  // —————————————————————————————— 改 —————————————————————————————— //

  /**
   * 开始远程修改
   */
  startEdit(state) {
    util.startDelay('Edit', state)
  },

  /**
   * 完成远程修改
   */
  completeEdit(state, msgSuccess) {
    util.completeRefresh('Edit', state, msgSuccess, this)
  },

  /**
   * 终止远程修改
   */
  stopEdit(state, e) {
    util.stop('Edit', state, e)
  },

  // —————————————————————————————— 删 —————————————————————————————— //

  /**
   * 开始远程删除
   */
  startDel(state) {
    util.startDelay('Del', state)
  },

  /**
   * 完成远程删除
   */
  completeDel(state, msgSuccess) {
    if (state.MAIN_START === 'startList' && !state.INIT_CONFIG.IS_LONG_LIST) state.param.page = 1 // 回到首页

    if (state.INIT_CONFIG.DEL_KEEP_ID) {
      util.completeRefresh('Del', state, msgSuccess, this)
    } else {
      state.one.id = '' // 重置单项 ID
      if (state.MAIN_START === 'startOne') util.complete('Del', state, msgSuccess)
      else util.completeRefresh('Del', state, msgSuccess, this)
    }
  },

  /**
   * 终止远程删除
   */
  stopDel(state, e) {
    util.stopClose('Del', state, e)
  },

  // —————————————————————————————— 通过 —————————————————————————————— //

  /**
   * 开始远程通过
   */
  startPass(state) {
    util.startDelay('Pass', state)
  },

  /**
   * 完成远程通过
   */
  completePass(state, msgSuccess) {
    util.completeRefresh('Pass', state, msgSuccess, this)
  },

  /**
   * 终止远程通过
   */
  stopPass(state, e) {
    util.stopClose('Pass', state, e)
  },

  // —————————————————————————————— 拒绝 —————————————————————————————— //

  /**
   * 开始远程拒绝
   */
  startRej(state) {
    util.startDelay('Rej', state)
  },

  /**
   * 完成远程拒绝
   */
  completeRej(state, msgSuccess) {
    util.completeRefresh('Rej', state, msgSuccess, this)
  },

  /**
   * 终止远程拒绝
   */
  stopRej(state, e) {
    util.stopClose('Rej', state, e)
  },
}

// ============================== 异步调用 ============================== //

const actions = {
  // —————————————————————————————— 提交 —————————————————————————————— //

  async remoteSubmit(context) {
    const { state: { API, MAP, one } } = context
    const TIP = API.transTip(MAP.tipSubmit, this.state.API) // 拼上根模块 API 的菜单

    const myParam = await API.transSubmit(one, context)
    const resp = await API.submit(myParam, TIP)

    // 列表处理
    if (CORE.isString(resp)) return resp
    else API.dealSubmit(resp, context)
  },

  // —————————————————————————————— 增 —————————————————————————————— //

  async remoteAdd(context) {
    const { state: { API, MAP, one } } = context
    const TIP = API.transTip(MAP.tipAdd, this.state.API) // 拼上根模块 API 的菜单
    const myParam = await API.transAdd(one, context)
    const msg = await API.add(myParam, TIP)
    return msg
  },

  // —————————————————————————————— 改 —————————————————————————————— //

  async remoteEdit(context) {
    const { state: { API, MAP, one } } = context
    const TIP = API.transTip(MAP.tipEdit, this.state.API) // 拼上根模块 API 的菜单
    let myParam
    if (API.transEditToAdd) myParam = await API.transAdd(one, context)
    else myParam = await API.transEdit(one, context)
    const msg = await API.edit(myParam, TIP)
    return msg
  },

  // —————————————————————————————— 删 —————————————————————————————— //

  async remoteDel(context) {
    const { state: { API, MAP, one } } = context
    const TIP = API.transTip(MAP.tipDel, this.state.API) // 拼上根模块 API 的菜单
    const myParam = await API.transDel(one, context)
    const msg = await API.del(myParam, TIP)
    return msg
  },

  // —————————————————————————————— 通过 —————————————————————————————— //

  async remotePass(context) {
    const { state: { API, MAP, one } } = context
    const TIP = API.transTip(MAP.tipPass, this.state.API) // 拼上根模块 API 的菜单
    const myParam = await API.transPass(one, context)
    const msg = await API.pass(myParam, TIP)
    return msg
  },

  // —————————————————————————————— 拒绝 —————————————————————————————— //

  async remoteRej(context) {
    const { state: { API, MAP, one } } = context
    const TIP = API.transTip(MAP.tipRej, this.state.API) // 拼上根模块 API 的菜单
    const myParam = await API.transRej(one, context)
    const msg = await API.rej(myParam, TIP)
    return msg
  },
}

// ============================== 导出仓库 ============================== //

export default { state, getters, mutations, actions }
